﻿using Learun.Util;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace Learun.Application.TwoDevelopment.ZZDT_EC
{
    /// <summary>
    /// 版 本 PIT-ADMS V7.0.3 敏捷开发框架
    /// Copyright (c) 2013-2018 Hexagon PPM
    /// 创 建：超级管理员
    /// 日 期：2022-06-21 15:32
    /// 描 述：信号
    /// </summary>
    [SugarTable(TableName = "ec_Wire_Group")]
    public class ec_Wire_GroupEntity
    {
        public ec_Wire_GroupEntity()
        {
            //SoftTags = new List<ec_SofttagEntity>();
            NewSoftTags = new List<ec_Wire_GroupEntity>();
            //Status = WireGroupStatusEnum.New;
        }
        #region 实体成员
        /// <summary>
        /// 状态。比如“待删除的”。默认为New
        /// 去找lr base dataitem数据字典的be_signalstate
        /// </summary>
        //[JsonConverter(typeof(SignalStatusConverter))]
        public WireGroupStatusEnum Status { get; set; } = WireGroupStatusEnum.New;

        /// <summary> 
        /// 某一个输出的信号，可以关联多个输入的信号。关联的是<see cref="Wire_Group_ID"/>
        /// </summary>
        public string LinkedID { get; set; } = "";

        /// <summary>
        /// ID
        /// </summary>
        /// <returns></returns>
        [SugarColumn(IsPrimaryKey = true)]
        public string Wire_Group_ID { get; set; }

        /// <summary>
        /// 信号名称（CH. No.)。
        /// 1462，C列。
        /// 8600，A列。
        /// 如果是虚拟点。就是主信号+<see cref="Code"/>
        /// </summary>
        /// <returns></returns>
        public string Group_Name { get; set; } = "";
        /// <summary>
        /// ChannelID。ec_panel_channel里。
        /// 如果为空，说明这个信号是关联前的状态（或者说未关联的状态）
        /// </summary>
        /// <returns></returns>
        public string ChannelID { get; set; } = "";
        /// <summary>
        /// 英文描述(Description)。
        /// 1462，D列。
        /// 8600，B列。
        /// </summary>
        /// <returns></returns>
        public string Group_Desc_EN { get; set; } = "";
        /// <summary>
        /// 中文描述。
        /// 8600，B列（第二行）。
        /// </summary>
        /// <returns></returns>
        public string Group_Desc { get; set; } = "";
        /// <summary>
        /// (Signal_Type)信号类型，如4-20mA。
        /// 1462，I列。
        /// 8600，E列（模拟量）或F列（开关量）。
        /// </summary>
        /// <returns></returns>
        public string IO_Type { get; set; } = "";

        /// <summary>
        /// 信号的分组（组成Group Name的第一部分）
        /// </summary>
        /// <returns></returns>
        public string Signal_Group { get; set; } = "";
        /// <summary>
        /// 信号的序号（组成Group Name的第二部分）
        /// </summary>
        /// <returns></returns>
        public string Signal_SeqNo { get; set; } = "";
        /// <summary>
        /// 信号组模板ID(平台上，savesignal时，不会带出这个)。
        /// 只是公司级上才有意义。
        /// </summary>
        /// <returns></returns>
        public string WireGroupTemplateID { get; set; } = "";
        /// <summary>
        /// 代码。
        /// 1462，H列。
        /// </summary>
        /// <returns></returns>
        public string Code { get; set; } = "";
        /// <summary>
        /// Range_Min。
        /// 1462，J列。
        /// 8600，G列（111~222）。
        /// </summary>
        /// <returns></returns>
        public string Range_Min { get; set; } = "";
        /// <summary>
        /// Range_Max.
        /// 1462,k列。
        /// 8600，G列（111~222）。
        /// </summary>
        /// <returns></returns>
        public string Range_Max { get; set; } = "";
        /// <summary>
        /// Range_Min和Range_Max的单位。
        /// 1462，L列。
        /// 8600，H列。
        /// </summary>
        /// <returns></returns>
        public string Unit { get; set; } = "";
        /// <summary>
        /// Alarm_LL。
        /// 1462，m列。
        /// 8600，J列（第一行或第二行不确定）。
        /// </summary>
        /// <returns></returns>
        public string Alarm_LL { get; set; } = "";
        /// <summary>
        /// Alarm_L。
        /// 1462，n列。
        /// 8600，I列（第一行或第二行不确定）。
        /// </summary>
        /// <returns></returns>
        public string Alarm_L { get; set; } = "";
        /// <summary>
        /// Alarm_H。
        /// 1462，o列。
        /// 8600，I列（第一行或第二行不确定）。
        /// </summary>
        /// <returns></returns>
        public string Alarm_H { get; set; } = "";
        /// <summary>
        /// Alarm_HH。
        /// 1462，p列。
        /// 8600，J列（第一行或第二行不确定）。
        /// </summary>
        /// <returns></returns>
        public string Alarm_HH { get; set; } = "";
        /// <summary>
        /// AL_GRP  延申报警组。
        /// 1462，S列。
        /// 8600，U列。
        /// </summary>
        /// <returns></returns>
        public string AL_GRP { get; set; } = "";
        /// <summary>
        /// BL_GRP  抑制报警。
        /// 1462，T列。
        /// 8600，T列。
        /// </summary>
        /// <returns></returns>
        public string BL_GRP { get; set; } = "";
        /// <summary>
        /// 延时。
        /// 1462，U列。
        /// 8600，S列。
        /// </summary>
        /// <returns></returns>
        public string Time_Delay { get; set; } = "";
        /// <summary>
        /// 供应商。
        /// 1463，V列。
        /// 8600，L列。
        /// </summary>
        /// <returns></returns>
        public string Supplier { get; set; } = "";

        /// <summary>
        /// 设备名
        /// </summary>
        /// <returns></returns>
        public string EquipName { get; set; } = "";
        /// <summary>
        /// 传感器代码。
        /// 1462，W列。
        /// 8600，K列。
        /// </summary>
        /// <returns></returns>
        public string SENSOR_CODE { get; set; } = "";
        /// <summary>
        /// VDR_Record。
        /// 1462，X列。
        /// </summary>
        /// <returns></returns>
        public bool VDR_Record { get; set; } = false;

        /// <summary>
        /// 是否为slow down信号。
        /// 1462，Q列。
        /// </summary>
        /// <returns></returns>
        public bool SLD { get; set; } = false;

        /// <summary>
        /// 是否为shut down信号。
        /// 1462，R列。
        /// </summary>
        /// <returns></returns>
        public bool SHD { get; set; } = false;
        /// <summary>
        /// Remarks。
        /// 1462，Y列。
        /// 8600，X列。
        /// </summary>
        /// <returns></returns>
        public string Remarks { get; set; } = "";

        /// <summary>
        /// 信号归属
        /// true，代表该信号是电气进行最终审核确认；
        /// false，代表该信号是轮机进行最终审核确认；
        /// </summary>
        public bool ElecOnly { get; set; } = false;

        /// <summary>
        /// 是否为通讯点。
        /// 1462，通过<see cref="ec_Wire_GroupEntity.Remarks"/>里的文字判断
        /// 8600，通过K列里的文字判断
        /// </summary>
        public bool CommunicationPoint { get; set; } = false;


        ///// <summary>
        ///// ECC 。Bool类型数据库要么是int要么是bool
        ///// </summary>
        //public bool ECC { get; set; } = false;

        ///// <summary>
        ///// WCC
        ///// </summary>
        //public bool WCC { get; set; } = false;
        ///// <summary>
        ///// BCC
        ///// </summary>
        //public bool BCC { get; set; } = false;
        /// <summary>
        /// IO类型，AI AO DI DO
        /// </summary>
        public string InOrOut { get; set; } = "";
        /// <summary>
        /// 驾驶室（控制台）。
        /// 8600，M列。导入时，如果2行都有值，中间会|分开
        /// </summary>
        public string WHConsole { get; set; } = "";
        /// <summary>
        /// 驾驶室（计算机）。
        /// 8600，N列。导入时，如果2行都有值，中间会|分开
        /// </summary>
        public string WHCPU { get; set; } = "";
        /// <summary>
        /// 集控室（控制台）。
        /// 8600，O列。导入时，如果2行都有值，中间会|分开
        /// </summary>
        public string ECRConsole { get; set; } = "";
        /// <summary>
        /// 集控室（计算机）。
        /// 8600，P列（excel中，两行均有值时，以|分开）
        /// </summary>
        public string ECRCPU { get; set; } = "";
        /// <summary>
        /// 船舶办公室（控制台）。
        /// 8600，Q列。导入时，如果2行都有值，中间会|分开
        /// </summary>
        public string ShipOfficeConsole { get; set; } = "";
        /// <summary>
        /// 船舶办公室（计算机）。
        /// 8600，R列。导入时，如果2行都有值，中间会|分开
        /// </summary>
        public string ShipOfficeCPU { get; set; } = "";
        /// <summary>
        /// 安全保护。(和<see cref="SLD"/> <see cref="SHD"/>列有关系)
        /// 8600，V列。
        /// </summary>
        public string SafetyProt { get; set; } = "";
        /// <summary>
        /// 安全保护延时。
        /// 8600，V列下。
        /// </summary>
        public string SafetyDelay { get; set; } = "";
        /// <summary>
        /// 自动控制。
        /// 8600，W列。
        /// </summary>
        public string AutoCtrl { get; set; } = "";
        /// <summary>
        /// 爸爸。如果有值，则代表其为虚拟点的概念
        /// <see cref="Wire_Group_ID"/>
        /// </summary>
        public string ParentID { get; set; } = "";
        /// <summary>
        /// 删除标记。因为哪怕是删除了，也要保留数据，以便日后查看。
        /// </summary>
        public bool DeleteFlg { get; set; } = false;

        /// <summary>
        /// 电缆位号(某些项目的<see cref="ec_projectSettingsEntity"/>里，是允许编辑的IO_allowManualAssign)
        /// </summary>
        public string CableName { get; set; }
        /// <summary>
        /// 通讯类信号<see cref="ec_CableEntity.CableClass"/>的母线ID<see cref="ec_CableEntity.CableID"/>
        /// </summary>
        public string CableId { get; set; }
        /// <summary>
        /// 创建人
        /// </summary>
        /// <returns></returns>
        public string CreateUserID { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary>
        /// <returns></returns>
        public DateTime? CreateTime { get; set; }
        /// <summary>
        /// 更新人
        /// </summary>
        /// <returns></returns>
        public string UpdateUserID { get; set; }
        /// <summary>
        /// 更新时间
        /// </summary>
        /// <returns></returns>
        public DateTime? UpdateTime { get; set; }
        #endregion

        #region 扩展操作
        /// <summary>
        /// 新增调用
        /// </summary>
        public void Create()
        {
            this.Wire_Group_ID = Guid.NewGuid().ToString();
            this.CreateTime = Time.MySqlTime;
            UserInfo userInfo = LoginUserInfo.Get();
            this.CreateUserID = userInfo.userId;


        }
        /// <summary>
        /// 编辑调用
        /// </summary>
        /// <param name="keyValue"></param>
        public void Modify(string keyValue)
        {
            this.Wire_Group_ID = keyValue;
            this.UpdateTime = Time.MySqlTime;
            UserInfo userInfo = LoginUserInfo.Get();
            this.UpdateUserID = userInfo.userId;
        }
        #endregion

        #region 扩展字段
        ///// <summary>
        ///// 虚拟点 集合
        ///// </summary>
        ////[SugarColumn(IsIgnore = true)]
        //[Obsolete]
        //[Navigate(NavigateType.OneToMany, nameof(ec_SofttagEntity.Wire_Group_ID))] //配置了导航，方便DeleteNav，ec_softtag表中的wiregroupid
        //public List<ec_SofttagEntity> SoftTags { get; set; }


        [SugarColumn(IsIgnore = true)]
        public List<ec_Wire_GroupEntity> NewSoftTags { get; set; }
        /// <summary>
        /// 柜子
        /// </summary>
        [SugarColumn(IsIgnore = true)]
        public string PanelName { get; set; }
        /// <summary>
        /// 通道号
        /// </summary>
        [SugarColumn(IsIgnore = true)]
        public string ChannelName { get; set; }
        /// <summary>
        /// 端子排
        /// </summary>
        [SugarColumn(IsIgnore = true)]
        public string StripName { get; set; }

        /// <summary>
        /// 电缆对
        /// </summary>
        [SugarColumn(IsIgnore = true)]
        public string CableSetName { get; set; }

        /// <summary>
        /// status的具体文字描述
        /// </summary>
        [SugarColumn(IsIgnore = true)]
        public string StatusValue { get; set; }


        /// <summary>
        /// 操作历史（因为现在插件端的保存是一次性的。哪怕有多个动作，也只是一次提交）
        /// </summary> 
        [SugarColumn(IsIgnore = true)]
        public List<ActionHistory> ActionHistorys { get; set; }

        /// <summary>
        /// 信号属性变更历史
        /// </summary> 
        [SugarColumn(IsIgnore = true)]
        public List<ec_wire_group_propertyhisEntity> Propertyhis { get; set; }

        /// <summary>
        /// 信号日志
        /// </summary> 
        [SugarColumn(IsIgnore = true)]
        public List<ec_wire_group_logEntity> Logs { get; set; }
        #endregion
    }
    public enum WireGroupStatusEnum
    {
        /// <summary>
        /// 待删除
        /// </summary>
        [Description("待删除")]
        ToDelete = 01,
        /// <summary>
        /// 新增的
        /// </summary>
        [Description("新增的")]
        New = 02,
        /// <summary>
        /// 已关联
        /// </summary>
        [Description("已使用（关联）")]
        Used = 03,
        /// <summary>
        /// 已审核
        /// </summary>
        [Description("已确认（审核）")]
        Confirmed = 04,
        /// <summary>
        /// 重新打开
        /// </summary>
        [Description("重新打开")]
        Reopen = 05,
        /// <summary>
        /// 彻底删除
        /// </summary>
        [Description("彻底删除")]
        deleted = 06
    }
    public class ActionHistory
    {
        public DateTime? ActionTime { get; set; }
        public Action ActionType { get; set; }
        public string reason { get; set; }
    }
}

